/**
 * UE5桥接模块
 * 提供与UE5通信的接口
 */

import { MicrophoneSDK } from '../MicrophoneSDK';

/**
 * UE5桥接类
 * 用于在Web和UE5之间建立通信
 */
export class UE5Bridge {
  /**
   * 构造函数
   */
  constructor() {
    // 检查是否在UE5环境中运行
    this._isUE5Environment = typeof UE !== 'undefined' && UE && UE.MicrophoneSDK;
    
    // 创建SDK实例
    this._sdk = new MicrophoneSDK();
    
    // 麦克风状态
    this._microphoneStatus = 'inactive';
    
    // 初始化SDK
    this._initSDK();
  }
  
  /**
   * 初始化SDK
   * @private
   * @returns {Promise<boolean>} 初始化是否成功
   */
  async _initSDK() {
    try {
      // 初始化SDK
      const result = await this._sdk.initialize();
      if (!result) {
        console.error('SDK初始化失败');
        return false;
      }
      
      // 设置事件监听
      document.addEventListener('microphoneStatusChange', this._handleStatusChange.bind(this));
      document.addEventListener('audioLevelChange', this._handleAudioLevelChange.bind(this));
      document.addEventListener('microphoneError', this._handleError.bind(this));
      
      return true;
    } catch (error) {
      console.error('初始化SDK时出错:', error);
      return false;
    }
  }
  
  /**
   * 调用UE5函数
   * @private
   * @param {string} functionName - 要调用的函数名
   * @param {*} data - 要传递的数据
   */
  _callUE5(functionName, data) {
    if (this._isUE5Environment && UE.MicrophoneSDK && typeof UE.MicrophoneSDK[functionName] === 'function') {
      UE.MicrophoneSDK[functionName](data);
    }
  }
  
  /**
   * 处理麦克风状态变化
   * @private
   * @param {CustomEvent} event - 状态变化事件
   */
  _handleStatusChange(event) {
    const status = event.detail.status;
    this._microphoneStatus = status;
    this._callUE5('OnMicrophoneStatusChanged', status);
  }
  
  /**
   * 处理音频电平变化
   * @private
   * @param {CustomEvent} event - 电平变化事件
   */
  _handleAudioLevelChange(event) {
    const level = event.detail.level;
    this._callUE5('OnAudioLevelChanged', level);
  }
  
  /**
   * 处理错误
   * @private
   * @param {CustomEvent} event - 错误事件
   */
  _handleError(event) {
    const error = event.detail.error;
    this._callUE5('OnMicrophoneError', error);
  }
  
  /**
   * 开始麦克风
   * @returns {Promise<boolean>} 是否成功开始
   */
  async startMicrophone() {
    try {
      const result = await this._sdk.startListening();
      if (result) {
        this._microphoneStatus = 'active';
        this._callUE5('OnMicrophoneStatusChanged', 'active');
      }
      return result;
    } catch (error) {
      console.error('开始麦克风时出错:', error);
      this._callUE5('OnMicrophoneError', error.message);
      return false;
    }
  }
  
  /**
   * 停止麦克风
   * @returns {Promise<boolean>} 是否成功停止
   */
  async stopMicrophone() {
    try {
      const result = await this._sdk.stopListening();
      if (result) {
        this._microphoneStatus = 'inactive';
        this._callUE5('OnMicrophoneStatusChanged', 'inactive');
      }
      return result;
    } catch (error) {
      console.error('停止麦克风时出错:', error);
      this._callUE5('OnMicrophoneError', error.message);
      return false;
    }
  }
  
  /**
   * 获取麦克风状态
   * @returns {string} 麦克风状态 ('active' 或 'inactive')
   */
  getMicrophoneStatus() {
    return this._microphoneStatus;
  }
  
  /**
   * 设置增益
   * @param {number} gain - 增益值 (0-1)
   */
  setGain(gain) {
    this._sdk.setGain(gain);
  }
  
  /**
   * 启用调试模式
   * @param {boolean} enabled - 是否启用
   */
  enableDebug(enabled) {
    console.log(`调试模式: ${enabled ? '开启' : '关闭'}`);
    // 可以在这里添加更多调试相关的逻辑
  }
  
  /**
   * 释放资源
   */
  dispose() {
    // 移除事件监听
    document.removeEventListener('microphoneStatusChange', this._handleStatusChange);
    document.removeEventListener('audioLevelChange', this._handleAudioLevelChange);
    document.removeEventListener('microphoneError', this._handleError);
    
    // 释放SDK资源
    if (this._sdk) {
      this._sdk.dispose();
      this._sdk = null;
    }
  }
} 